package condominio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import condominio.excepcion.DAOExcepcion;
import condominio.modelo.Cuota;
import condominio.modelo.Usuario;
import condominio.modelo.Vivienda;
import condominio.util.ConexionBD;

public class CuotaDAO extends BaseDAO {
	
//	public Collection<Cuota> buscarPorNombre(int idVivienda) throws DAOExcepcion {
//		System.out.println("cuotaDAO: buscarPorNombre(int idVivienda)");
//		String query = "SELECT idCuota,idVivienda,vi001(idVivienda) vivienda,periodo,importe,fechaVencimiento from Cuotas where idCuota =?";
//		Collection<Cuota> lista = new ArrayList<Cuota>();
//		Connection con = null;
//		PreparedStatement stmt = null;
//		ResultSet rs = null;
//		try {
//			con = ConexionBD.obtenerConexion();
//			stmt = con.prepareStatement(query);
//	//		stmt.setString(1, "%" + nombre + "%");
//			stmt.setInt(1,idVivienda);
//			rs = stmt.executeQuery();
//			while (rs.next()) {
//				
//				Cuota vo = new Cuota();
//				Vivienda vi = new Vivienda();
//				
//				//seteamos la vivienda
//				vi.setIdVivienda(Integer.parseInt(rs.getString("idVivienda")));
//				vi.setUbicacion(rs.getString("vivienda"));
//				
//				//seteamos la cuota
//				vo.setIdCuota(Integer.parseInt(rs.getString("idCuota")));
//				vo.setVivienda(vi);
//				vo.setPeriodo(rs.getString("periodo"));
//				vo.setImporte(Double.parseDouble(rs.getString("importe")));
//				vo.setFechaVencimiento(rs.getString("fechaVencimiento"));
//				lista.add(vo);
//			}
//		} catch (SQLException e) {
//			System.err.println(e.getMessage());
//			throw new DAOExcepcion(e.getMessage());
//		} finally {
//			this.cerrarResultSet(rs);
//			this.cerrarStatement(stmt);
//			this.cerrarConexion(con);
//		}
//		return lista;
//	}

	public void insertar(Cuota vo) throws DAOExcepcion {
		//System.out.println("RolDAO: insertar(Rol vo)");
		String query = "INSERT INTO cuotas(idVivienda,periodo,importe,fechaVencimiento) VALUES (?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getVivienda().getIdVivienda());
			stmt.setString(2, vo.getPeriodo());
			stmt.setDouble(3, vo.getImporte());
			stmt.setString(4, vo.getFechaVencimiento());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Cuota obtener(int idCuota) throws DAOExcepcion {
		System.out.println("CuotasDAO: obtener(String rolNombre)");
		Cuota vo = new Cuota();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT idCuota,v.idVivienda,ubicacion vivienda,periodo,importe,fechaVencimiento from cuotas c,viviendas v where c.idVivienda = v.idvivienda	and c.idCuota =?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idCuota);
			rs = stmt.executeQuery();
			if (rs.next()) {
			
				Vivienda vi = new Vivienda();
				
				//seteamos la vivienda
				vi.setIdVivienda(Integer.parseInt(rs.getString("idVivienda")));
				vi.setUbicacion(rs.getString("vivienda"));
				
				//seteamos la cuota
				vo.setIdCuota(Integer.parseInt(rs.getString("idCuota")));
				vo.setVivienda(vi);
				vo.setPeriodo(rs.getString("periodo"));
				vo.setImporte(Double.parseDouble(rs.getString("importe")));
				vo.setFechaVencimiento(rs.getString("fechaVencimiento"));
			
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(int idCuota) throws DAOExcepcion {
		System.out.println("CuotasDAO: eliminar(String rolNombre)");
		String query = "DELETE FROM cuotas WHERE idCuota=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idCuota);
			int i = stmt.executeUpdate();
			if (i != 1) {

				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public void actualizar(Cuota vo) throws DAOExcepcion {
		System.out.println("cuotasDAO: actualizar(Cuotas vo)");
		String query = "update cuotas set importe=?,fechaVencimiento=? where idCuota=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			
		//	stmt.setInt(1, vo.getVivienda().getIdVivienda());
		//	stmt.setString(2, vo.getPeriodo());
			stmt.setDouble(1, vo.getImporte());
			stmt.setString(2, vo.getFechaVencimiento());
			stmt.setDouble(3, vo.getIdCuota());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Collection<Cuota> listar() throws DAOExcepcion {
		System.out.println("RolDAO: listar()");
		Collection<Cuota> c = new ArrayList<Cuota>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT idCuota,v.idVivienda,ubicacion vivienda,periodo,importe,fechaVencimiento from cuotas c,viviendas v where c.idVivienda = v.idvivienda";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cuota vo = new Cuota();
				Vivienda vi = new Vivienda();
			
				//seteamos la vivienda
				vi.setIdVivienda(Integer.parseInt(rs.getString("idVivienda")));
				vi.setUbicacion(rs.getString("vivienda"));
				
				//seteamos la cuota
				vo.setIdCuota(Integer.parseInt(rs.getString("idCuota")));
				vo.setVivienda(vi);
				vo.setPeriodo(rs.getString("periodo"));
				vo.setImporte(Double.parseDouble(rs.getString("importe")));
				vo.setFechaVencimiento(rs.getString("fechaVencimiento"));
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	
	public Collection<Cuota> cuotasPorPagar(int nResidente) throws DAOExcepcion {
	//	System.out.println("RolDAO: listar()");
		Collection<Cuota> c = new ArrayList<Cuota>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select c.idCuota, v.ubicacion vivienda, c.periodo, c.importe, c.fechavencimiento from cuotas c,viviendas v where c.idVivienda=v.idVivienda and v.idResidente = ? and idcuota not in (select idcuota from pagodecuotas )";
			stmt = con.prepareStatement(query);
			stmt.setInt(1, nResidente);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cuota vo = new Cuota();
				Vivienda vi = new Vivienda();
			
				//seteamos la vivienda
				//vi.setIdVivienda(Integer.parseInt(rs.getString("idVivienda")));
				vi.setUbicacion(rs.getString("vivienda"));
				
				//seteamos la cuota
				vo.setIdCuota(Integer.parseInt(rs.getString("idCuota")));
				vo.setVivienda(vi);
				vo.setPeriodo(rs.getString("periodo"));
				vo.setImporte(Double.parseDouble(rs.getString("importe")));
				vo.setFechaVencimiento(rs.getString("fechaVencimiento"));
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	
	public Collection<Cuota> listaMorosos() throws DAOExcepcion {
		//	System.out.println("RolDAO: listar()");
			Collection<Cuota> c = new ArrayList<Cuota>();
			Connection con = null;
			PreparedStatement stmt = null;
			ResultSet rs = null;
			try {
				con = ConexionBD.obtenerConexion();
				String query = "select c.idcuota, c.periodo, c.importe, c.fechaVencimiento, v.ubicacion vivienda, u.Nombre, u.ApellidoPaterno, u.ApellidoMaterno from  cuotas c, viviendas v, usuarios u where c.idVivienda=v.idVivienda and v.idResidente =u.idUsuario and c.fechaVencimiento<sysdate() and c.idcuota not in (select idcuota from pagodecuotas)";
				stmt = con.prepareStatement(query);
				
				rs = stmt.executeQuery();
				while (rs.next()) {
					Cuota vo = new Cuota();
					Vivienda vi = new Vivienda();
				    Usuario vu = new Usuario();
				    
				    vu.setNombre(rs.getString("nombre"));
				    vu.setApellidoPaterno(rs.getString("apellidopaterno"));
				    vu.setApellidoMaterno(rs.getString("apellidoMaterno"));
				   
					vi.setUbicacion(rs.getString("vivienda"));
					
					vi.setResidente(vu);
					//seteamos la cuota
					vo.setIdCuota(Integer.parseInt(rs.getString("idCuota")));
					vo.setVivienda(vi);
					vo.setPeriodo(rs.getString("periodo"));
					vo.setImporte(Double.parseDouble(rs.getString("importe")));
					vo.setFechaVencimiento(rs.getString("fechaVencimiento"));
					c.add(vo);
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return c;
		}
		
	
	
	public void pagarCuota(int idCuota,int  opcionPago) throws DAOExcepcion {
		//System.out.println("RolDAO: insertar(Rol vo)");
		String query = "INSERT INTO pagodecuotas(idCuota,tipopago) VALUES (?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idCuota);
			stmt.setInt(2, opcionPago);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}



}
